# 新增stat_manual()，提供了一种创建 ggplot2 扩展的新方式。
# 传统方法通常需要定义正式的类（class）和构造函数（constructor），这有一定的复杂性。
# 而 stat_manual()旨在规避这种复杂性，让扩展变得更灵活和直接。
make_centroids <- function(df) {
  transform(df, xend = mean(x, na.rm = TRUE), yend = mean(y, na.rm = TRUE))
}

make_hull <- function(df) {
  df <- df[complete.cases(df), , drop = FALSE]
  hull <- chull(df$x, df$y)
  df[hull, , drop = FALSE]
}

ggplot(penguins, aes(bill_dep, bill_len, colour = species)) +
  geom_point(na.rm = TRUE) +
  stat_manual(
    geom = "segment",
    fun = make_centroids,
    linewidth = 0.2,
    na.rm = TRUE
  ) +
  geom_polygon(
    stat = "manual",
    fun = make_hull,
    fill = NA,
    linetype = "dotted"
  )


# 新增stat_connect()的stat方法，
# 专门用于以阶梯状方式（stairstep fashion）连接观测点。
# 它的设计目的是将连接逻辑（如何画线）与几何表现（画成什么样子）分离开来
eco <- economics |>
  dplyr::mutate(year = lubridate::year(date)) |>
  dplyr::summarize(
    min = min(unemploy),
    max = max(unemploy),
    mid = median(unemploy),
    .by = year
  )

  
ggplot(eco, aes(year, y = mid, ymin = min, ymax = max)) +
  geom_line(stat = "connect") +
  geom_ribbon(stat = "connect", alpha = 0.4)

# stat_connect()不仅限于生成阶梯状连接，
# 其核心优势在于允许通过自定义的 2 列数值矩阵来定义任意连接模式，
# 从而极大地扩展了其应用场景和创意可能性。
x <- seq(0, 1, length.out = 20)[-1]
smooth <- cbind(x, scales::rescale(plogis(x, location = 0.5, scale = 0.1)))
zigzag <- cbind(c(0.4, 0.6, 1), c(0.75, 0.25, 1))
ggplot(head(eco, 10), aes(year, y = mid)) +
  geom_point() +
  stat_connect(aes(colour = "smooth"), connection = smooth) +
  stat_connect(aes(colour = "zigzag"), connection = zigzag)
